home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 1 (Walnut Creek)
/
Aminet - June 1993 [Walnut Creek].iso
/
usenet
/
sources
/
volume90
/
util
/
dwprint1
/
part01
/
src
/
DWPrint.c
next >
Wrap
C/C++ Source or Header
|
1990-04-29
|
8KB
|
325 lines
/*
*
* Module : dwprint.c
*
* Description : Print program for daisy wheels
*
* Author : Simon Raybould
*
* Date : January 1990
*
* Compiler switches :
*
* TEST - Send output to screen, for testing.
*
*/
#include <stdio.h> /* Yawn */
#include <intuition/intuition.h> /* For the window struct stuff */
#include <workbench/startup.h> /* For the filename from WB */
#include <workbench/workbench.h> /* For the filename from WB */
#define PRINTER "PRT:" /* Printer filename */
#define DEFAULTLPP 66 /* Default lines per page */
#define CTRLL 12 /* Control L */
#define MAXLINELEN 128
#define TAB 0x09 /* ASCii code for a horizontal tab */
#define TABSTOP 8 /* Tab stop every TABSTOP columns */
/*
* Globals
*/
char titlebuffer[80];
short LinesPerPage = DEFAULTLPP;
struct IntuitionBase *IntuitionBase;
struct GfxBase *GfxBase;
struct Window *LittleWindow;
struct IntuiMessage *Message;
struct RastPort *RP;
ULONG IconBase = 0;
/* WB Startup stuff */
extern struct WBStartup *WBenchMsg;
struct FileLock *startlock, *newlock;
/*** The Newwindow Structure. ***/
char TITLETEXT[] = "DWPrint V1.2 S.J.Raybould 1990";
struct TextAttr Font = {
(STRPTR)"topaz.font",
TOPAZ_EIGHTY, 0, 0
};
/* Gadget to do NEXT PAGE */
USHORT NextVectors[] = {
0, 0, 80, 0, 80, 12, 0, 12, 0, 1,
79, 1, 79, 11, 1, 11, 1, 1
};
struct Border NextBorder = {
-2, -2, /* Initial offsets, gadget relative */
1, 0, JAM1, /* Frontpen, Backpen, Drawmode */
9, /* Number of vectors*/
NextVectors, /* Pointer to array of vectors */
NULL /* No next border */
};
struct IntuiText NextText = {
1, 0, /* Frontpen, Backpen */
JAM1, /* Drawmode */
3, 1, /* Leftedge, Topedge (relative to gadget) */
&Font, /* Pointer to font structure */
"NEXT PAGE", /* Actual text */
NULL /* Next text */
};
struct Gadget Next = {
NULL, /* Pointer to next gadget */
130, 60, 77, 9, /* Left, Top, Width, Height */
GADGHCOMP, /* Flags */
RELVERIFY|GADGIMMEDIATE,/* Activation Flags */
BOOLGADGET, /* Type */
(APTR)&NextBorder, /* Pointer to border border image */
NULL, /* No pointer to select render */
&NextText, /* Pointer to Ituitext structure */
0, /* Mutual exclude */
NULL, /* Pointer to Special info */
0, /* no ID */
NULL /* Pointer to special data */
};
struct NewWindow NewLittleWindow = {
40, /* Left edge */
15, /* Top edge */
330, /* Width */
80, /* Height */
0, /* Front pen */
1, /* Back pen */
CLOSEWINDOW | GADGETUP, /* IDCMP Flags */
WINDOWDRAG | WINDOWDEPTH | RMBTRAP | WINDOWCLOSE | NOCAREREFRESH, /* Windo Flagz */
&Next, /* First Gadget */
NULL, /* Custom menu image */
TITLETEXT, /* Window title */
NULL, /* Custom screen */
NULL, /* Custom bitmap */
10, /* Minimum Width */
10, /* Minimum Height */
500, /* Maximum Width */
160, /* Maximum Height */
WBENCHSCREEN, /* Type of screen */
};
void main(argc, argv)
int argc;
char **argv;
{
register int Class;
struct Window *OpenWindow();
struct IntuiMessage *GetMsg();
struct WBArg *arg;
char *filename, sbuffer[80], buffer[MAXLINELEN], *buf_ptr, line;
unsigned char FromWB = FALSE;
int page=1;
FILE *fp;
void ChkToolTypes();
FILE *pfp;
char *chstr = "CHANGE PAPER AND CLICK NEXT PAGE";
char *rchstr= " ";
char ContLine = FALSE;
char wbuffer[MAXLINELEN], *rptr;
short wptr;
newlock = startlock = (struct FileLock *)NULL;
switch(argc) {
case 0:
FromWB = TRUE;
/* Check if user has set lines per page in tool types */
ChkToolTypes();
#ifdef TRACE
printf("NumArgs = %d\n", WBenchMsg->sm_NumArgs);
arg = WBenchMsg->sm_ArgList;
printf("Arg0 = %s\n", (char *)arg->wa_Name);
arg++;
printf("Arg1 = %s\n", (char *)arg->wa_Name);
#endif /* TRACE */
if(WBenchMsg->sm_NumArgs != 2) {
fprintf(stderr, "No file selected.\n");
Delay(300);
exit(1);
} else {
arg = WBenchMsg->sm_ArgList;
arg++;
filename = (char *)arg->wa_Name;
newlock = (struct FileLock *)arg->wa_Lock;
startlock = (struct FileLock *)CurrentDir(newlock);
}
break;
case 2:
filename = argv[1];
break;
case 3:
filename = argv[1];
LinesPerPage = atoi(argv[2]);
if(LinesPerPage > 0)
break;
/* ELSE FALL THROUGH TO USAGE */
default:
fprintf(stderr, "Usage: %s <filename> [n]\n", argv[0]);
exit(1);
}
IntuitionBase=(struct IntuitionBase *)OpenLibrary("intuition.library",0);
GfxBase = (struct GfxBase *)OpenLibrary("graphics.library",0);
LittleWindow = OpenWindow(&NewLittleWindow);
if (LittleWindow == NULL) exit(400L);/* No memory for little window! */
RP = LittleWindow->RPort;
SetAPen(RP, 1);
SetBPen(RP, 0);
SetDrMd(RP, JAM2);
/*
* OK it's about time we actually did somthing dwprint'ish.
*/
if((fp = fopen(filename, "r")) == (FILE *)NULL) {
fprintf(stderr, "Failed to open input file \"%s\"\n", filename);
perror("Reason");
if(FromWB)
Delay(300);
CloseWindow(LittleWindow);
if(newlock != startlock)
CurrentDir(startlock);
exit(1);
}
#ifndef TEST
if((pfp = fopen(PRINTER, "w")) == (FILE *)NULL) {
fprintf(stderr, "Failed to open printer\n");
perror("Reason");
if(FromWB)
Delay(300);
CloseWindow(LittleWindow);
if(newlock != startlock)
CurrentDir(startlock);
exit(1);
}
if(FromWB) {
close(0);
close(1);
close(2);
}
#else /* If TEST switch set */
pfp = stdout;
#endif /* TEST */
SetAPen(RP, 3);
Move(RP, 50, 20);
Text(RP, "Printing:", strlen("Printing:"));
SetAPen(RP, 1);
Move(RP, 130, 20);
Text(RP, filename, strlen(filename));
/* Wait for event */
for (;;) {
for(line=1;line<(LinesPerPage+1);line++) {
sprintf(sbuffer, "Page: %-3d Line: %-2d", page, line);
Move(RP, 50, 35);
Text(RP, sbuffer, strlen(sbuffer));
if(!ContLine) {
if(fgets(buffer, MAXLINELEN, fp) == (FILE *)NULL) {
CloseWindow(LittleWindow);
if(newlock != startlock)
CurrentDir(startlock);
fclose(fp);
fclose(pfp);
exit(0);
}
buf_ptr = buffer; /* Reset ptr to start of buffer */
}
/* If CTRL-L then end page */
if(*buf_ptr == CTRLL) {
ContLine = TRUE;
fputc(*buf_ptr++, pfp); /* Send Cntrl L */
fflush(pfp);
if(!*buf_ptr) /* End of line reached. */
ContLine = FALSE; /* Don't put NULL on its own page */
break;
} else {
ContLine = FALSE;
for(wptr = 0;wptr < MAXLINELEN;wptr++)
wbuffer[wptr] = ' ';
for(wptr = 0, rptr = buf_ptr;*rptr != '\0';rptr++) {
if(*rptr == TAB)
wptr = ((wptr/TABSTOP) + 1) * TABSTOP;
else
wbuffer[wptr++] = *rptr;
}
wbuffer[wptr] = *rptr;
fputs(wbuffer, pfp); /* Output line */
fflush(pfp);
}
}
Move(RP, 40, 50);
Text(RP, chstr, strlen(chstr));
page++;
SetWindowTitles(LittleWindow, -1, titlebuffer);
Message = GetMsg(LittleWindow->UserPort);
while (Message == NULL) {
/* Lets be nice to other tasks! Ya! */
Wait(1<<LittleWindow->UserPort->mp_SigBit);
Message = GetMsg(LittleWindow->UserPort);
};
Class = Message->Class;
if (Message != NULL) ReplyMsg(Message);
switch(Class) {
case CLOSEWINDOW:
CloseWindow(LittleWindow);
if(newlock != startlock)
CurrentDir(startlock);
fclose(fp);
fclose(pfp);
exit(0);
case GADGETUP:
Move(RP, 40, 50);
Text(RP, rchstr, strlen(rchstr));
break; /* Just go round again */
default:
#ifdef TRACE
fprintf(stderr, "Unkown message (0x%x) recieved\n", Class);
#endif /* TRACE */
break;
}
}
}
void ChkToolTypes()
{
struct DiskObject *diskobj;
struct WBArg *arg;
char **toolarray, *s, *progname;
arg = WBenchMsg->sm_ArgList;
progname = (char *)arg->wa_Name;
if(IconBase = OpenLibrary("icon.library", 0)) {
diskobj = (struct DiskObject *)GetDiskObject(progname);
if(diskobj) {
toolarray = diskobj->do_ToolTypes;
if(s=(char *)FindToolType(toolarray, "LINESPERPAGE")) {
LinesPerPage = atoi(s);
#ifdef TRACE
printf("Found it, got %d\n", LinesPerPage);
#endif /* TRACE */
}
}
FreeDiskObject(diskobj);
}
}